home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / md-i386-gcc / m68k.h next >
C/C++ Source or Header  |  1998-01-20  |  4KB  |  144 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * MC68000 emulation - machine dependent bits
  5.   *
  6.   * Copyright 1996 Bernd Schmidt
  7.   */
  8.  
  9.  
  10. struct flag_struct {
  11.     unsigned int c:1; /* first byte */
  12.     int :5;
  13.     unsigned int z:1;
  14.     unsigned int n:1;
  15.     int :3;           /* second, third & fourth byte */
  16.     unsigned int v:1; 
  17.     int :20;
  18.     unsigned int x:1; /* fifth */
  19.     int :31;
  20. };
  21.  
  22. extern struct flag_struct regflags __asm__ ("regflags");
  23.  
  24. #define ZFLG (regflags.z)
  25. #define NFLG (regflags.n)
  26. #define CFLG (regflags.c)
  27. #define VFLG (regflags.v)
  28. #define XFLG (regflags.x)
  29.  
  30. static __inline__ int cctrue(const int cc)
  31. {
  32.     switch(cc){
  33.      case 0: return 1;                       /* T */
  34.      case 1: return 0;                       /* F */
  35.      case 2: return !CFLG && !ZFLG;          /* HI */
  36.      case 3: return CFLG || ZFLG;            /* LS */
  37.      case 4: return !CFLG;                   /* CC */
  38.      case 5: return CFLG;                    /* CS */
  39.      case 6: return !ZFLG;                   /* NE */
  40.      case 7: return ZFLG;                    /* EQ */
  41.      case 8: return !VFLG;                   /* VC */
  42.      case 9: return VFLG;                    /* VS */
  43.      case 10:return !NFLG;                   /* PL */
  44.      case 11:return NFLG;                    /* MI */
  45.      case 12:return NFLG == VFLG;            /* GE */
  46.      case 13:return NFLG != VFLG;            /* LT */
  47.      case 14:return !ZFLG && (NFLG == VFLG); /* GT */
  48.      case 15:return ZFLG || (NFLG != VFLG);  /* LE */
  49.     }
  50.     abort();
  51.     return 0;
  52. }
  53.  
  54. #define x86_flag_testl(v) \
  55.   __asm__ __volatile__ ("testl %1,%1\n\t" \
  56.             "pushfl\n\t" \
  57.             "popl %0\n\t" \
  58.             "movl %0,regflags\n" \
  59.             : "=r" (scratch) : "r" (v) : "cc")
  60.  
  61. #define x86_flag_testw(v) \
  62.   __asm__ __volatile__ ("testw %w1,%w1\n\t" \
  63.             "pushfl\n\t" \
  64.             "popl %0\n\t" \
  65.             "movl %0,regflags\n" \
  66.             : "=r" (scratch) : "r" (v) : "cc")
  67.  
  68. #define x86_flag_testb(v) \
  69.   __asm__ __volatile__ ("testb %b1,%b1\n\t" \
  70.             "pushfl\n\t" \
  71.             "popl %0\n\t" \
  72.             "movl %0,regflags\n" \
  73.             : "=r" (scratch) : "q" (v) : "cc")
  74.  
  75. #define x86_flag_addl(v, s, d) \
  76.   __asm__ __volatile__ ("addl %k2,%k1\n\t" \
  77.             "pushfl\n\t" \
  78.             "popl %0\n\t" \
  79.             "movl %0,regflags\n\t" \
  80.             "movl %0,regflags+4\n" \
  81.             : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
  82.  
  83. #define x86_flag_addw(v, s, d) \
  84.   __asm__ __volatile__ ("addw %w2,%w1\n\t" \
  85.             "pushfl\n\t" \
  86.             "popl %0\n\t" \
  87.             "movl %0,regflags\n\t" \
  88.             "movl %0,regflags+4\n" \
  89.             : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
  90.  
  91. #define x86_flag_addb(v, s, d) \
  92.   __asm__ __volatile__ ("addb %b2,%b1\n\t" \
  93.             "pushfl\n\t" \
  94.             "popl %0\n\t" \
  95.             "movl %0,regflags\n\t" \
  96.             "movl %0,regflags+4\n" \
  97.             : "=r" (scratch), "=q" (v) : "qmi" (s), "1" (d) : "cc")
  98.  
  99. #define x86_flag_subl(v, s, d) \
  100.   __asm__ __volatile__ ("subl %k2,%k1\n\t" \
  101.             "pushfl\n\t" \
  102.             "popl %0\n\t" \
  103.             "movl %0,regflags\n\t" \
  104.             "movl %0,regflags+4\n" \
  105.             : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
  106.  
  107. #define x86_flag_subw(v, s, d) \
  108.   __asm__ __volatile__ ("subw %w2,%w1\n\t" \
  109.             "pushfl\n\t" \
  110.             "popl %0\n\t" \
  111.             "movl %0,regflags\n\t" \
  112.             "movl %0,regflags+4\n" \
  113.             : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
  114.  
  115. #define x86_flag_subb(v, s, d) \
  116.   __asm__ __volatile__ ("subb %b2,%b1\n\t" \
  117.             "pushfl\n\t" \
  118.             "popl %0\n\t" \
  119.             "movl %0,regflags\n\t" \
  120.             "movl %0,regflags+4\n" \
  121.             : "=r" (scratch), "=q" (v) : "qmi" (s), "1" (d) : "cc")
  122.  
  123. #define x86_flag_cmpl(s, d) \
  124.   __asm__ __volatile__ ("cmpl %k1,%k2\n\t" \
  125.             "pushfl\n\t" \
  126.             "popl %0\n\t" \
  127.             "movl %0,regflags\n" \
  128.             : "=r" (scratch) : "rmi" (s), "r" (d) : "cc")
  129.  
  130. #define x86_flag_cmpw(s, d) \
  131.   __asm__ __volatile__ ("cmpw %w1,%w2\n\t" \
  132.             "pushfl\n\t" \
  133.             "popl %0\n\t" \
  134.             "movl %0,regflags\n" \
  135.             : "=r" (scratch) : "rmi" (s), "r" (d) : "cc")
  136.  
  137. #define x86_flag_cmpb(s, d) \
  138.   __asm__ __volatile__ ("cmpb %b1,%b2\n\t" \
  139.             "pushfl\n\t" \
  140.             "popl %0\n\t" \
  141.             "movl %0,regflags\n" \
  142.             : "=r" (scratch) : "qmi" (s), "q" (d) : "cc")
  143.  
  144.